﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;
using System.IO;


namespace DAH_TD_
{
    public class TileMap
    {
        private ContentManager m_content;

         // Map-Größe in Tiles
        private int m_map_width;
        private int m_map_height;

         // Tile-Größe
        private int m_tile_width;
        private int m_tile_height;

         // ein zweidimensionales Integer-Feld
        private List<List<Tile>> m_map;

         // Feld mit Texturen
        private List<Texture2D> m_texture;

         // Konstruktor
        public TileMap()
         {
             m_map_width = 0;
             m_map_height = 0;

             m_tile_width = 0;
             m_tile_height = 0;

             m_map = new List<List<Tile>>();
             m_texture = new List<Texture2D>();

             m_map.Clear();
         }

         // Map initialisieren
        public bool Init(ContentManager content)
         {
             m_content = content;
             return true;
         }

        //Dateipfad finden
        internal static string GetProjectPath()
        {
            // Ergebnis: Debug- oder Release-Ordner im Projektordner.
            string projectPath = Environment.CurrentDirectory;
            // Mit jedem Durchlauf geht es im Verzeichnisbaum eine Stufe höher.
            for (int i = 0; i <= 5; i++)
            {
                projectPath = System.IO.Path.GetDirectoryName(projectPath);
            }
            return projectPath + @"\";
        }


        // Map laden
        public bool Load(string path)
        {
            System.IO.StreamReader file;

            String currentDirectory = GetProjectPath();

            // Map-Datei öffnen
            file = new System.IO.StreamReader(Path.Combine(currentDirectory, path));

            m_map_width = Convert.ToInt32(file.ReadLine());
            m_map_height = Convert.ToInt32(file.ReadLine());
            m_tile_width = Convert.ToInt32(file.ReadLine());
            m_tile_height = Convert.ToInt32(file.ReadLine());


            // Anzahl der Texturen einlesen
            int textureCount = Convert.ToInt32(file.ReadLine());

            // Alle Pfade zu den Texturen einlesen und diese erstellen
            for (int i = 0; i < textureCount; i++)
            {
                m_texture.Add(m_content.Load<Texture2D>(file.ReadLine()));
            }

            // Alle TextureIDs und Collisionwerte einlesen
            // Dazu alle Spalten und alle Zeilen der Map durchlaufen
            for (int i = 0; i < m_map_height; i++)
            {
                // Neue Zeile erstellen
                List<Tile> temp = new List<Tile>();

                for (int j = 0; j < m_map_width; j++)
                {
                    // vor den Werten für das Tile kommt immer eine Zeile,
                    // die nicht berücksichtigt wird und als kommentarzeile dienen kann
                    file.ReadLine();

                    // neues Tile erstellen
                    Tile tile = new Tile(i, j);

                    // erster Wert bedeutet TextureID
                    tile.GroundLayer = Convert.ToInt32(file.ReadLine());

                    // zweiter Wert sagt aus ob das tile begehbar ist
                    tile.Collision = (Convert.ToInt32(file.ReadLine()) == 1) ? true : false;

                    // Tile in die Zeile einfügen
                    temp.Add(tile);
                }

                m_map.Add(temp);
            }

            // Datei schließen
            file.Close();

            return true;
        }

         // Map zeichnen
        public void Draw(SpriteBatch batch)
         {
             // alle Zeilen durchlaufen
            for (int i = 0; i < m_map_height; i++)
             {
                 // Alle Spalten durchlaufen
                for (int j = 0; j < m_map_width; j++)
                 {
                     // je nach Textur-Nummer in der Map,
                    // andere Grafik zeichnen
                     int ground_texture_nr = m_map[i][j].GroundLayer;

                     // wenn kleiner null (-1), dann wird kein Sprite gezeichnet
                    if (ground_texture_nr < 0)
                         continue;
                    // Weg = Nr 1
                    if (ground_texture_nr == 1) { m_map[i][j].weg = true; }

                     // Grundlayer zeichnen
                    batch.Draw(m_texture[ground_texture_nr], new Rectangle(m_tile_width * j, m_tile_height * i, m_tile_width, m_tile_height), Color.White);
                 }
             }
         }

        // Gibt ein Tile an Position x,y zurück
        public Tile GetTile(int x, int y)
        {
            return m_map[y][x];
        }

         // die Map-Breite in Tiles zurückgeben
        public int GetWidth()
         {
             return m_map_width;
         }

         // die Map-Höhe in Tiles zurückgeben
        public int GetHeight()
         {
             return m_map_height;
         }

        // die Tilebreite zurückgeben
        public int getTileWidth()
        {
            return this.m_tile_width;
        }

        // die Tilehöhe zurückgeben
        public int getTileHeight()
        {
            return this.m_tile_height;
        }

         // Gibt Anzahl der Texturen zurück, die in der Map verwendet werden
        public int GetTextureCount()
         {
             return m_texture.Count;
         }
    }
}
